<?php

namespace app\api\controller;

use app\common\controller\Api;
use think\Cache;

/**
 * 首页接口
 */
class Novel extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];

    /**
     * 首页
     *
     */
    public function index()
    {
        $this->success('请求成功');
    }

    // 获取所有章节
    public function getAllChapter()
    {
        $postdata = $this->request->param(''); 
        // 获取当前请求的协议  
        $protocol = $this->request->server('REQUEST_SCHEME');  
        // 获取当前请求的域名  
        $domain = $this->request->host(); 
        $path = $postdata['filepath'];
        $filePath = $protocol . '://' . $domain . $path;
        // 文章正则
        $pattern = '/第\s*[一二三四五六七八九十百千万零〇]+\s*章\s+[^。，；\r\n]*/u';

        // 定义缓存键
        $cacheKey = $filePath;
        
        // 尝试从缓存中读取文件内容
        $fileContent = Cache::get($cacheKey);
        
        if ($fileContent === false) {
            $file = fopen($filePath, "r");

            if (!$file) {
                $this->error('无法打开文件');
                return;
            }
            // 读取整个文件内容
            $fileContent = '';
            while (($line = fgets($file)) !== false) {
                $fileContent .= $line;
            }
            fclose($file);

            // 检测并转换文件内容编码
            $encoding = mb_detect_encoding($fileContent, mb_list_encodings(), true);
            if ($encoding !== 'UTF-8') {
                $fileContent = mb_convert_encoding($fileContent, 'UTF-8', $encoding);
            }
            // 将转换后的内容保存到缓存
            Cache::set($cacheKey, $fileContent, 3600); // 缓存1小时
        }

        $chapters = [];
        $currentChapter = '';
        $currentTitle = '';
    
        // 分割内容为行
        $lines = explode("\n", $fileContent);
        
        foreach ($lines as $line){
            // 使用 str_replace 去除全角空格
            $line = str_replace("\u{3000}", "", $line);
            $line = trim($line);
            // 检查是否匹配章节标题
            if (preg_match($pattern, $line, $matches)) {
                // 如果已经有章节内容，保存当前章节
                if (!empty($currentTitle)) {
                    $chapters[] = [
                        'title' => $currentTitle,
                        // 'content' => trim($currentChapter)
                    ];
                }
                // 开始新的章节
                $currentTitle = $matches[0];
                $currentChapter = '';
            }
    
            // 如果已经找到章节标题，继续追加内容
            if (!empty($currentTitle)) {
                $currentChapter .= $line;
            }
        }
    
        // 添加最后一个章节（如果有）
        if (!empty($currentTitle)) {
            $chapters[] = [
                'title' => $currentTitle,
                // 'content' => trim($currentChapter)
            ];
        }

        $this->success('请求成功',$chapters);
    }

    // 获取章节内容
    public function getChapterContent()
    {
        $postdata = $this->request->param('');
        $chapterTitle = $postdata['chapterTitle'];
        $protocol = $this->request->server('REQUEST_SCHEME');
        $domain = $this->request->host();
        $path = $postdata['filepath'];
        $filePath = $protocol . '://' . $domain . $path;

        // 定义缓存键
        $cacheKey = $filePath;
        
        // 尝试从缓存中读取文件内容
        $fileContent = Cache::get($cacheKey);
        
        if ($fileContent === false) {
            $file = fopen($filePath, "r");

            if (!$file) {
                $this->error('无法打开文件');
                return;
            }
            // 读取整个文件内容
            $fileContent = '';
            while (($line = fgets($file)) !== false) {
                $fileContent .= $line;
            }
            fclose($file);

            // 检测并转换文件内容编码
            $encoding = mb_detect_encoding($fileContent, mb_list_encodings(), true);
            if ($encoding !== 'UTF-8') {
                $fileContent = mb_convert_encoding($fileContent, 'UTF-8', $encoding);
            }
            // 将转换后的内容保存到缓存
            Cache::set($cacheKey, $fileContent, 3600); // 缓存1小时
        }

        $currentChapter = '';
        $found = false;
        $nextChapterPattern = '/第\s*[一二三四五六七八九十百千万零〇]+\s*章\s+[^。，；\r\n]*/u';

        // 分割内容为行
        $lines = explode("\n", $fileContent);
        
        foreach ($lines as $line) {
            // 使用 str_replace 去除全角空格
            $line = str_replace("\u{3000}", "", $line);
            if (strpos($line, $chapterTitle) !== false) {
                $found = true;
                continue; // 进入下一行读取章节内容
            }

            if ($found) {
                if (preg_match($nextChapterPattern, $line)) {
                    break; // 找到下一个章节标题，结束当前章节内容的读取
                }
                $currentChapter .= $line . "\n";
            }
        }

        if ($found) {
            $this->success('请求成功', $currentChapter);
        } else {
            $this->error('未找到对应章节');
        }
    }

}
